// fs是nodejs的核心模块之一
const fs = require('node:fs')
const fsp = require('node:fs/promises')
// fs的api也有同步、异步之分 ， 不加Sync就是异步
// 1.读取文件  readFile    readFileSync
/*
fs.readFile('./test.js', {
    encoding: 'utf-8',
    flag: 'r'
}, (err ,data) => {
    if(err) throw err
    console.log(data);
})
    flag的值：
        'a': 打开文件进行追加。 如果文件不存在，则创建该文件。
        'ax': 类似于 'a' 但如果路径存在则失败。
        'a+': 打开文件进行读取和追加。 如果文件不存在，则创建该文件。
        'ax+': 类似于 'a+' 但如果路径存在则失败。
        'as': 以同步模式打开文件进行追加。 如果文件不存在，则创建该文件。
        'as+': 以同步模式打开文件进行读取和追加。 如果文件不存在，则创建该文件。
        'r': 打开文件进行读取。 如果文件不存在，则会发生异常。
        'r+': 打开文件进行读写。 如果文件不存在，则会发生异常。
        'rs+': 以同步模式打开文件进行读写。 指示操作系统绕过本地文件系统缓存。
        'w': 打开文件进行写入。 创建（如果它不存在）或截断（如果它存在）该文件。
        'wx': 类似于 'w' 但如果路径存在则失败。
        'w+': 打开文件进行读写。 创建（如果它不存在）或截断（如果它存在）该文件。
        'wx+': 类似于 'w+' 但如果路径存在则失败。
*/
// 同步方式， 会阻塞代码执行
// const reader = fs.readFileSync('./test.js')   // 返回的是一个流
// console.log(reader.toString());
// console.log(reader.toString('utf-8'));
// 使用promise的版本
// fsp.readFile('./test.js').then(result => {
//     console.log(result.toString());
// }).catch(err => {

// })

// 2.可读流  createReadStream
// const readStream = fs.createReadStream('./test.js')   // 返回一个对象
// readStream.on('data', (chunk) => {   // 监听读取的块
//     console.log(chunk.toString());     // 对于大文件会一段一段的读
// })
// readStream.on('end', () => {
//     console.log('读取完成');
// })

// 3.创建文件夹 mkdirSync
// fs.mkdirSync('./mms')    // 创建单个文件夹
// fs.mkdirSync('./mmp/xm/zz', { 
//     recursive: true                // 如果要递归的创建多层文件夹，必须要开启这个参数
// })

// 4.删除文件夹  rmSync
// fs.rmdirSync('./mmp/xm/zz')
// fs.rmdirSync('./mmp', { 
//     recursive: true                // 如果要递归的删除文件夹，也是必须要开启这个参数
// })
// fs.rmSync('./mmp', {      // 这个也行
//     recursive: true                // 如果要递归的删除文件夹，也是必须要开启这个参数
// })

// 重命名文件 renameSync
fs.renameSync('./index.txt', 'readme.txt')  // 参数是原文件和新文件名称

// 监听文件内容的变化
fs.watch('./test.js', (event, filename) => {
    console.log(event, filename);   // event是change事件， filename 就是 test.js
})

// fs 底层是调用 libuv 实现的

// 5.写文件  writeFileSync    appendFileSync
fs.writeFileSync('./index.txt', 'NnNnNn')   // 这种方式是会覆盖之前的内容的
fs.writeFileSync('./index.txt', 'NnNnNno', {
    flag: 'a'   // 追加的方式， a就是 append
}) 
fs.appendFileSync('./index.txt', 'mmp')  // 这个方法也是追加

// 创建可写流 createWriteStream   用于大量的数据分批写入
const writeStream = fs.createWriteStream('./index.txt')

writeStream.write('sssss')
let art = ['aaaaaaaaaaa', 'bbbbbbbbbbb']
art.forEach(item => {
    writeStream.write(item)
})
writeStream.end()   // 写完后要关掉这个流

writeStream.on('finish', () => {  // 监听文件流写完
    console.log('写完了');
})

// 硬连接
// fs.linkSync('./index.txt', './readme.txt')  // 参数分别是 原始文件地址和硬连接之后的文件地址，创建完成后练个文件可以实现联动，共享一个内存地址的
// 硬连接作用： 做共享文件、做备份文件， 原始文件删掉不会影响连接后的文件的

// 软连接, 很像windows的快捷方式， 这个需要管理员权限，可以管理员身份打开cmd，再操作这个文件
// 删掉原文件后，进行软连接的文件是无法使用的
fs.symlinkSync('./index.txt', './ban.txt')

